package com.example.backend.service;

import com.example.backend.ai.guardrail.SafeInputGuardrail;
import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.Result;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.guardrail.InputGuardrails;
import dev.langchain4j.service.spring.AiService;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;

import java.util.List;


/**
 * @AiService 注解
 *
 * 此注解可能用于标记服务类或接口，表示该类或接口是一个AI服务组件。
 * 通常在Spring框架或类似框架中，此类注解用于自动配置或注入相关功能。
 * 具体功能和用途可能取决于所使用的AI框架或库的实现。
 */
//@AiService  // 此注解被注释掉了，表示当前未使用该注解
@InputGuardrails(SafeInputGuardrail.class) // 使用输入防护栏注解，指定SafeInputGuardrail类作为输入安全检查的实现
public interface AiCodeHelperService { // 定义一个AI代码助手服务接口



    /**
     * AI服务聊天方法
     * @param userMessage 用户输入的消息
     * @return 返回AI的回复字符串
     */
    @SystemMessage(fromResource = "system-prompt.txt") // 系统消息注解，从system-prompt.txt资源文件加载系统提示
    String AiServiceChat(String userMessage);




    /**
     * AI服务报告生成方法
     * @param userMessage 用户输入的消息
     * @return 返回一个Report对象，包含名称和建议列表
     */
    @SystemMessage(fromResource = "system-prompt.txt") // 系统消息注解，从system-prompt.txt资源文件加载系统提示
    Report AiServiceReport(String userMessage);



    /**
     * Report记录类，用于封装报告数据
     * @param name 报告名称
     * @param suggestList 建议列表
     */
    record Report(String name, List<String> suggestList){} // 使用Java 14+的record类型定义不可变数据类




    /**
     * 带有RAG(检索增强生成)功能的AI聊天方法
     * @param userMessage 用户输入的消息
     * @return 返回一个Result对象，其中包含字符串类型的响应数据
     */
    @SystemMessage(fromResource = "system-prompt.txt") // 系统消息注解，从system-prompt.txt资源文件加载系统提示
    Result<String> chatWithRag(String userMessage);

    /**
     * 流式输出聊天方法

     * @param memoryId 内存ID，用于维护会话上下文
     * @param message 用户输入的消息
     * @return 返回一个Flux<String>，用于流式输出响应
     */
    Flux<String> chatStream(@MemoryId int memoryId,@UserMessage String message); // 使用Reactor的Flux实现响应式流式输出

}


